package com.cl.myInterface.impl;

import com.cl.container.ClBean;
import com.cl.container.MyContainer;
import com.cl.myInterface.DisposeClass;
import com.cl.util.ScannerClass;

import java.lang.reflect.Method;
import java.util.List;

public class InjectBeanToContainer implements DisposeClass {
    @Override
    public int order() {
        return 4;
    }

    @Override
    public void dispose(List<Class> clazz) {
        /*
         * 开始注入service的bean
         * */
        //将收集到的待注入的所有bean进行注入
        MyContainer.getContainer().forEach((beanName, clBean) -> {
            Object object = ScannerClass.injectClBean(beanName, clBean.getObject().getClass());

            //用相同的beanName , 把容器中对应的bean给替换掉,因为原来初始化的容器中的bean的需要注入属性都是没有注入的,都是null,
            //经过这里注入后,替换为已经注入了属性的 bean
            ClBean clBean1 = new ClBean();
            clBean1.setBeanName(beanName);
            clBean1.setObject(object);
            clBean1.setaClass(clBean.getObject().getClass());
            MyContainer.putBean(beanName,clBean1);
            MyContainer.putAfterInjectBean(beanName, object);
        });



        /*
        TODO 这里与上面有点重复,考虑优化
         * 开始注入controller中的bean
         * */
        //将收集到的待注入的所有bean进行注入
        MyContainer.getControllerContainer().forEach((url, clController) -> {
            //获取出方法对象,这个不能换掉
            Method controllerMethod = clController.getControllerMethod();
            Object object = ScannerClass.injectClBean(url, clController.getObject().getClass());

            //用相同的beanName , 把容器中对应的bean给替换掉,因为原来初始化的容器中的bean的需要注入属性都是没有注入的,都是null,
            //经过这里注入后,替换为已经注入了属性的 bean
            com.cl.container.ClController clController1 = new com.cl.container.ClController();
            clController1.setUrl(url);
            //Object替换掉 (替换为已经注入了属性的Object)
            clController1.setObject(object);
            //对应的method不替换
            clController1.setControllerMethod(controllerMethod);
            MyContainer.putClController(url,clController1);
        });
    }
}
